<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="ypgT1" id="ypgT1"><span data-lake-id="u83d65773" id="u83d65773">典型回答</span></h1>
  <p data-lake-id="u31d495c0" id="u31d495c0"><br></p>
  <p data-lake-id="u8bafa6fe" id="u8bafa6fe"><strong><span data-lake-id="uf16bb4e2" id="uf16bb4e2">在Innodb中，通过MVCC解决脏读和不可重复读，通过MVCC+间隙锁解决幻读的。</span></strong></p>
  <p data-lake-id="u749e0200" id="u749e0200"><span data-lake-id="u8c55105c" id="u8c55105c">​</span><br></p>
  <p data-lake-id="u9bf18052" id="u9bf18052"><strong><span data-lake-id="u196f48fb" id="u196f48fb" style="color: var(--yq-text-primary)">脏读的解决。</span></strong><span data-lake-id="u7fede222" id="u7fede222" style="color: var(--yq-text-primary)">脏读指一个事务可以读取另一个事务未提交的数据，导致数据不一致。InnoDB 通过在每行数据中添加一个隐藏的事务 ID 来实现 MVCC，当一个事务开始时，它会获取一个唯一的事务 ID，该事务 ID 被用来标记该事务所做的修改。当一个事务读取一行数据时，InnoDB 检查该行数据的事务 ID 是否小于当前事务的 ID，只有小于当前事务ID才是已提交的数据。否则，说明该行数据是未提交的数据，InnoDB 将阻止该事务读取该行数据，从而避免了脏读的问题。</span></p>
  <p data-lake-id="ueb6bf9af" id="ueb6bf9af"><span data-lake-id="uedd520d7" id="uedd520d7">​</span><br></p>
  <p data-lake-id="uf38ebcf7" id="uf38ebcf7"><strong><span data-lake-id="u140b6eb4" id="u140b6eb4">不可重读的解决。</span></strong><span data-lake-id="u64580bbe" id="u64580bbe">不可重复读指一个事务读取同一行数据两次，但是在两次读取之间另一个事务修改了该行数据，导致两次读取的结果不同。InnoDB 通过使用 MVCC 来解决不可重复读的问题。在RR这种隔离级别下，当我们使用快照读进行数据读取的时候，只会在第一次读取的时候生成一个Read View，后续的所有快照读都是用的同一个快照，所以就不会发生不可重复读的问题了。</span></p>
  <p data-lake-id="u8d0de54e" id="u8d0de54e"><span data-lake-id="ud224aecf" id="ud224aecf">​</span><br></p>
  <p data-lake-id="ued735d5b" id="ued735d5b"><strong><span data-lake-id="u8a02c614" id="u8a02c614">幻读的解决。</span></strong><span data-lake-id="u17a6a5bc" id="u17a6a5bc">InnoDB的RR级别中，基于MVCC+间隙锁，是在某种程度上是可以避免幻读的发生的，但是没有办法完全避免，当一个事务中发生当前读的时候，会导致幻读的发生。详情参考：</span></p>
  <p data-lake-id="u7cea83fd" id="u7cea83fd"><span data-lake-id="u82ef39cf" id="u82ef39cf">​</span><br></p>
 </body>
</html>